package de.mnit.basis.swt.statisch;

import org.eclipse.swt.SWT;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.widgets.Event;

import de.mnit.basis.daten.FilterText;
import de.mnit.basis.fehler.Fehler;

/**
 * @author Michael Nitsche
 * 30.11.2010	Erstellt
 */
public class TasteSWT {

	// Wert absteigend!
	private static enum TASTE {
		F12(SWT.F12),		// 16777237
		F11(SWT.F11),		// 16777236
		F10(SWT.F10),		// 16777235
		F9(SWT.F9),			// 16777234
		F8(SWT.F8),			// 16777233
		F7(SWT.F7),			// 16777232
		F6(SWT.F6),			// 16777231
		F5(SWT.F5),			// 16777230
		F4(SWT.F4),			// 16777229
		F3(SWT.F3),			// 16777228
		F2(SWT.F2),			// 16777227
		F1(SWT.F1),			// 16777226
		STRG(SWT.CTRL),		// 262144
		SHIFT(SWT.SHIFT),	// 131072
		ALT(SWT.ALT),		// 65536
		ENTF(SWT.DEL);		// 127

		public final int wert;

		private TASTE(int wert) {
			this.wert=wert;
		}
	}


	public static String zahlZuText(int swtkey) {
		String erg="";
		int rest=swtkey;

		for(TASTE te : TASTE.values())
			if(rest >= te.wert) {
				rest-=te.wert;
				erg+=te.name()+"+";
			}

		return rest>0
			? erg+(char)rest
			: FilterText.teil(-2,true,erg);
	}

	public static int textZuZahl(String tasten) {
		int erg=0;
		String teil;
		while(tasten.length()>0) {
			teil=FilterText.bis("+ -".toCharArray(),false,tasten);
			if(teil.length()!=tasten.length())
				teil=FilterText.teil(-2, true, teil);
			if(teil.length()+1<tasten.length())
				tasten=FilterText.teil(teil.length()+2,false,tasten); else tasten="";
			erg=erg+parseTaste(teil);
		}
		return erg;
	}

	public static boolean istReturn(KeyEvent ke) {
		return iReturn(ke.keyCode);
	}

	public static boolean istReturn(Event ke) {
		return iReturn(ke.keyCode);
	}

	// INTERN

	private static boolean iReturn(int keycode) {
		return keycode==13 || keycode==16777296; // (Enter || Nummernblock-Enter)
	}

	private static int parseTaste(String taste) {
		taste=taste.toUpperCase();
		if(taste.length()>1) {
			for(TASTE te : TASTE.values())
				if(taste.equals(te.name()))
					return te.wert;
			throw Fehler.text.da_Ungueltig(taste);
		}
		else {
			if(taste.length()==1)
				return (char)taste.charAt(0);
			throw Fehler.text.da_Ungueltig(taste);
		}
	}
}
